package com.zjsru.oneDay202203;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author: likew
 * @Date: 2022/3/6
 * <p>
 * 适合打劫银行的日子
 * <p>
 * 如果第 i天满足以下所有条件，我们称它为一个适合打劫银行的日子：
 * <p>
 * 第 i天前和后都分别至少有 time天。 第 i天前连续 time天警卫数目都是非递增的。 第 i天后连续 time天警卫数目都是非递减的。
 * <p>
 * 更正式的，第 i 天是一个合适打劫银行的日子当且仅当： security[i - time] >= security[i - time + 1] >= ... >= security[i] <= ... <= security[i +
 * time - 1] <= security[i + time].
 * <p>
 * 输入：security = [5,3,3,3,5,6,2], time = 2 输出：[2,3] 解释： 第 2 天，我们有 security[0] >= security[1] >= security[2] <=
 * security[3] <= security[4] 。 第 3 天，我们有 security[1] >= security[2] >= security[3] <= security[4] <= security[5] 。
 * 没有其他日子符合这个条件，所以日子 2 和 3 是适合打劫银行的日子。
 */
public class goodDaysToRobBank {
    
    public List<Integer> goodDaysToRobBank(int[] security, int time) {
        int len = security.length;
        int[] left = new int[len];//第 i 天前警卫数目连续非递增的天数为 left
        int[] right = new int[len];//第 i 天后警卫数目连续非递减的天数为 right
        for (int i = 1; i < len; i++) { //从第一天开始，从两边比较时有0
            if (security[i] <= security[i - 1]) { //保证非递增
                left[i] = left[i - 1] + 1;
            }
            if (security[len - i - 1] <= security[len - i]) { //保证非递减,即递增
                right[len - i - 1] = right[len - i] + 1;
            }
        }
        List<Integer> list = new ArrayList<>();
        for (int i = time; i < len - time; i++) { //保证 前后时间足够
            if (left[i] >= time && right[i] >= time) {
                list.add(i);
            }
        }
        return list;
    }
    
    public static void main(String[] args) {
        goodDaysToRobBank goodDaysToRobBank = new goodDaysToRobBank();
        int[] security = new int[] {5, 3, 3, 3, 5, 6, 2};
        int time = 2;
        System.out.println(goodDaysToRobBank.goodDaysToRobBank(security, time));
    }
    
}
